/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Vista.Tarea;

import Modelo.Entidades.Respuesta;
import java.util.ArrayList;
import java.util.List;
import javax.swing.ComboBoxModel;
import javax.swing.event.ListDataEvent;
import javax.swing.event.ListDataListener;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.TableModel;


/*
 *  Proyecto eJAM [G12]
 *  Miembros:
 *      - Javier Ruiz Hidalgo
 *      - Adrian Ramos Cápitas
 *      - Miguel Alejandro Esteban Ordóñez
 */

public class RespuestasTableAndComboModel implements TableModel, ComboBoxModel {


    private List<Respuesta> respuestas = new ArrayList<Respuesta>();
    private List<TableModelListener> tableListeners = new ArrayList<TableModelListener>();
    private List<ListDataListener> dataListeners = new ArrayList<ListDataListener>();

    //Implementacion Singleton
    private static RespuestasTableAndComboModel model=null;

    private RespuestasTableAndComboModel(){}

    public static RespuestasTableAndComboModel create(){
        if(model==null)
            model=new RespuestasTableAndComboModel();
        return model;
    }

    public List<Respuesta> getRespuestas() {
        return respuestas;
    }

    public void setRespuestas(List<Respuesta> respuestas) {
        this.respuestas = respuestas;
        fireContentsChanged();
    }

    protected void fireContentsChanged() {
        fireContentsChangedTableModel();
        fireContentsChangedListData();
    }
    //--------------- MÉTODOS PROPIOS DE TableModel -------------------------

    public Respuesta getRow(int indexRow) {
        return respuestas.get(indexRow);
    }

    public int getRowCount() {
        return respuestas.size();
    }

    public int getColumnCount() {
        return 2; //ya que tendremos tres valores a mostrar por contacto
    }

    public String getColumnName(int columnIndex) {
        String name = null;
        switch (columnIndex) {
            case 0:
                name = "Índice";
                break;
            case 1:
                name = "Descripción";
                break;
        }
        return name;
    }

    public Class<?> getColumnClass(int columnIndex) {
        Class<?> clase = null;

        switch (columnIndex) {
            case 0:
                clase = String.class;
                break;
            case 1:
                clase = Integer.class;
                break;
        }
        return clase;
    }

    public boolean isCellEditable(int rowIndex, int columnIndex) {
        return false; //No permito editar celdas
    }

    public Object getValueAt(int rowIndex, int columnIndex) {
        Respuesta respuesta = respuestas.get(rowIndex);
        Object value = null;
        switch (columnIndex) {
            case 0:
                value = respuesta.getNumR() + 1;
                break;
            case 1:
                value = respuesta.getDescripcion();
                break;
        }
        return value;

    }

    public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public void addTableModelListener(TableModelListener l) {
        tableListeners.add(l);
    }

    public void removeTableModelListener(TableModelListener l) {
        tableListeners.remove(l);
    }

    protected void fireContentsChangedTableModel() {
        //TableModelEvent event = new TableModelEvent(this,0,getRowCount());
        TableModelEvent event = new TableModelEvent(this, 0, this.getRowCount() - 1, TableModelEvent.ALL_COLUMNS, TableModelEvent.INSERT);
        for (TableModelListener listener : tableListeners) {
            listener.tableChanged(event);
        }
    }
    //--------------- MÉTODOS PROPIOS DE ComboBoxModel -------------------------
    private Respuesta respuestaSelected = null;

    public void setSelectedItem(Object anItem) {
        if (anItem != null) {
            respuestaSelected = (Respuesta) anItem;
            fireContentsChangedListData();
        }
    }

    public Object getSelectedItem() {
        return respuestaSelected;
    }

    public int getSize() {
        return respuestas.size();
    }

    public Object getElementAt(int index) {
        return respuestas.get(index);
    }

    public void addListDataListener(ListDataListener l) {
        dataListeners.add(l);
    }

    public void removeListDataListener(ListDataListener l) {
        dataListeners.remove(l);
    }

    protected void fireContentsChangedListData() {
        ListDataEvent e = new ListDataEvent(this, ListDataEvent.CONTENTS_CHANGED, 0, respuestas.size());
        for (ListDataListener l : dataListeners) {
            l.contentsChanged(e);
        }
    }
}
